前言

我们要买房子,当然是要到人多的地方买,这样才热闹,如果买到人气不旺的地方搞不好会得抑郁症,出于这个目的,我们要制作一个二手房爬虫,并调用百度api了解哪个地区房子热门.

设计

  1. 爬取链家二手房数据
  2. 调用百度地图api,根据二手房地址,获取经纬度坐标
  3. 通过经纬度坐标和关注热度,再次调用百度地图api绘制热力图

网页分析

因为链家的数据并没有通过js渲染,不是ajax加载,所以数据提取过程非常简单,直接去网页寻找就行.这里就不分析了.

具体实现

  1. 通过https://www.lianjia.com/city/网址获取所有城市名对应的代号,以便爬取不同的城市.

    def getCityCodeList(): url='https://www.lianjia.com/city/' res=requests.get(url,headers=header) doc=pq(res.text) pattern=re.compile(r'<a\shref=["|'].//(\w{2}).*">(.)<') cityCodeList={} aList=doc('.city_list_ul a').items() for a in aList: matcher=pattern.match(str(a)) cityCodeList[(matcher.group(2))]=matcher.group(1) return cityCodeList

  2. 创建一个解析房屋信息的函数

    def parseHouseInfo(text): houseInfoList=[] doc=pq(text) infoList=doc('.sellListContent li').items() for info in infoList: #小区名地址address subAddress=[i.text() for i in info('.positionInfo').items('a')] address=subAddress[1]+subAddress[0] #热度hot hot=re.findall(r'^(\d+)人',info('.followInfo').text())[0] #样式style,面积space (style,space,abandon)=re.findall(r'(\d{1}室\d{1}厅).*\s(\d+(.\d+)?平米)',info('.houseInfo').text())[0] #价格price price=info('.totalPrice span').text()+'万' houseInfoList.append((address,hot,style,space,price)) return houseInfoList

  3. 调用上面两个方法,解析出我们想要城市的房屋信息,并写入csv文件

    def crawlToFile(city,pg=100): houseFile = open(city+'.csv','w',newline='') houseHeader=['address','location','hot','style','space','price'] csvWriter=DictWriter(houseFile,houseHeader) csvWriter.writeheader() cityCodeList=getCityCodeList() cityCode=cityCodeList[city] baseUrl='https://'+cityCode+'.lianjia.com/ershoufang/pg' for i in range(1,pg+1): res=requests.get(baseUrl+str(i),headers=header) time.sleep(1) # (小区地址,热度,房屋样式(几室几厅),房屋大小,房价) houseInfoList=parseHouseInfo(res.text) for houseInfo in houseInfoList: address,hot,style,space,price = houseInfo location=getLocation(city,address) houseRow={ 'address':address, 'location':location, 'hot':hot, 'style':style, 'space':space, 'price':price } csvWriter.writerow(houseRow) houseFile.close()

  4. 根据csv文件,提取出我们想要的经纬度和热度信息,保存到json文件中

    def getHotMapData(filepath): hotMapData=[] with open(filepath) as houseInfo: reader=csv.reader(houseInfo) for row in reader: lngAndLat=row[1].split(',') if len(lngAndLat)==2: lng=float(lngAndLat[0]) lat=float(lngAndLat[1]) hot=int(re.findall(r'\d+',row[5])[0]) subData={'lng':lng,'lat':lat,'count':hot} hotMapData.append(subData) hotMapJson=json.dumps(hotMapData) with open('hotMap.json','w') as hotMapFile: hotMapFile.write("var points="+hotMapJson)

  5. 使用百度提供的绘制热力图网页,导入我们的json数据,绘制成热力图.这个页面是复制粘贴过来的,不需要了解,只需要使用就行.

    热力图功能示例

百度热力图页面基本设置 20200420115103-2021-12-29-17-23-01 20200420115601-2021-12-29-17-23-21 以上只是基本设置,具体可以参照百度地图api文档

完整的实例代码可以去我的github下载

结束语

  1. 通过以上步骤,我们就能知道哪个小区人们关注度高.团结就是力量,人越多的地方力量越大.
  2. 这个爬虫只是一个简单demo,可以发挥我们的想象,把它变成房屋信息全能蜘蛛.奥利干!
THE END
推荐文章
  • 爱普生L3250系列的打印机如何清洗打印机头

  • docker删除未使用到的镜像

  • 在VPS的CentOS7.6系统中,安装新版内核并开启BBR加速

  • 解决电信本地宽带限制访问香港服务器

  • 黄帝内经-生气通天论

  • 去除input和textarea点击选中框

  • 使用acme生成https证书,并部署

  • sql如何查询空值

评论 共0条
开启精彩搜索

热门搜索

暂无

历史搜索

用户名/邮箱/手机号
密码
用户名
密码
重复密码
邮箱/手机号
验证码
发送验证码
59秒后可重发
注册
找回密码
邮箱/手机号
验证码
发送验证码
59秒后可重发
新密码
重复密码
请选择支付方式
余额支付

购买将消耗【10

微信支付
微信扫码支付 0 元
[ 04分50秒 ]
请使用微信扫一扫
扫描二维码支付
支付宝支付
支付宝扫码支付 0 元
[ 04分50秒 ]
请使用支付宝扫一扫
扫描二维码支付
已完成支付
未完成支付

请输入验证码

点击验证码可以刷新

你确认吗?

确认

2024年10月1日

0字

0字

2024年10月

0字

新增

0字

新增

0字

0字

新增

0字

0字

新增

0字

0字

新增

0字

0字

新增

0字

0字

新增

0字

0字

新增

0字

0字

0字

新增

0字

0字

0字

0字

新增

0字

0字